Olea Price API
Olea Markets publishes Olea Price, a daily benchmark for olive oil producer prices in the world's leading producing markets, built exclusively from official and semi-official public sources. Every published value carries a reliability block and is bit-for-bit reproducible under methodology v1.0.0.
Getting started
Base URL: https://api.oleamarkets.com. All price data is in EUR/kg
(3 decimals); stocks are in metric tons. Values are published daily.
Grab a key at oleamarkets.com/pricing (every plan starts with a 7-day free trial), then:
curl -H "Authorization: Bearer olea_YOUR_KEY" https://api.oleamarkets.com/v1/latest
Five indices are published:
OLEA-EVOO-ES, OLEA-VIRGIN-ES, OLEA-LAMP-ES,
OLEA-EVOO-IT and OLEA-EVOO-EU (EU production-weighted composite).
Authentication
All endpoints except GET /v1/status, this page and
POST /mcp require an API key, passed either way:
curl -H "Authorization: Bearer olea_YOUR_KEY" https://api.oleamarkets.com/v1/latest curl "https://api.oleamarkets.com/v1/latest?apikey=olea_YOUR_KEY"
Response envelope
Every JSON response — success and error — uses the same envelope. Success:
{
"success": true,
"data": { "...": "endpoint-specific" },
"unit": "EUR/kg",
"metric": "price.index.latest",
"reliability": {
"sources_count": 3,
"observations_count": 17,
"confidence": 0.87,
"last_updated": "2026-07-14T06:00:12Z",
"methodology_version": "1.0.0",
"methodology_url": "https://oleamarkets.com/methodology"
},
"meta": { "request_id": "3f7f0f1e-8f0a-4a52-9f9b-1c2d3e4f5a6b", "credits_used": 1 }
}
The reliability block tells you how much the number can be trusted: how many
sources and observations produced it, a 0–1 confidence score and the exact methodology
version. Values carried forward on days without fresh observations are flagged
"stale": true.
Endpoints
Eight endpoints under /v1, each documented below with its parameters, an
example request and an example response. Endpoints marked
paid require a paid plan.
GET/v1/status — Service healthno key
Pipeline health: per-source freshness plus latest value, date, confidence and stale flag of
each index. metric: meta.status, credits_used: 0.
Example request
curl https://api.oleamarkets.com/v1/status
GET/v1/symbols — The five indices
Metadata for all published indices. metric: meta.symbols. data is a list of:
Example request
curl -H "Authorization: Bearer olea_YOUR_KEY" https://api.oleamarkets.com/v1/symbols
Example item
{
"code": "OLEA-EVOO-ES",
"label": "Olea Price — Extra Virgin Olive Oil, Spain",
"grade": { "code": "evoo", "label": "Extra Virgin Olive Oil" },
"country": "ES",
"scope": "country",
"unit": "EUR/kg",
"decimals": 3,
"frequency": "daily",
"methodology_version": "1.0.0",
"methodology_url": "https://oleamarkets.com/methodology"
}
The EU composite (OLEA-EVOO-EU) has country: null and scope: "eu_composite".
GET/v1/latest — Latest index value
Latest published value of one index — or of all five — with 1-day, 1-week and 1-year
percentage changes. metric: price.index.latest.
Parameters
| Param | Required | Description |
|---|---|---|
index | no | Index code. Omit for all five indices (then data is a list). |
Example request
curl -H "Authorization: Bearer olea_YOUR_KEY" \ "https://api.oleamarkets.com/v1/latest?index=OLEA-EVOO-ES"
Example response (data)
{
"index": "OLEA-EVOO-ES",
"date": "2026-07-14",
"value_eur_kg": 4.512,
"change_1d": -0.35,
"change_1w": 1.12,
"change_1y": -23.4,
"stale": false
}
Changes are percentages vs the closest value at or before 1 day / 1 week / 1 year earlier;
null when there is no history that far back.
GET/v1/historical — Daily historical seriespaid
Daily series of one index between two dates. Starter plans see at most 1 year back from
today: the range is clamped and data.plan_limited is set to true.
Pro and Business have full history. metric: price.index.historical.
Parameters
| Param | Required | Description |
|---|---|---|
index | yes | Index code. |
from | no | Y-m-d. Defaults to one year before to. |
to | no | Y-m-d. Defaults to today. |
Example request
curl -H "Authorization: Bearer olea_YOUR_KEY" \ "https://api.oleamarkets.com/v1/historical?index=OLEA-EVOO-ES&from=2026-01-01&to=2026-07-14"
Example response (data)
{
"index": "OLEA-EVOO-ES",
"from": "2026-01-01",
"to": "2026-07-14",
"plan_limited": false,
"count": 195,
"series": [
{ "date": "2026-01-01", "value_eur_kg": 4.702, "confidence": 0.91, "stale": false }
]
}
GET/v1/regional — Regional observationspaid
Non-quarantined price observations from the last 30 days. All filters optional.
Parameters
| Param | Description |
|---|---|
country | ISO2, e.g. ES. |
region | e.g. jaen. |
grade | evoo, virgin, lampante, refined, pomace. |
Example request
curl -H "Authorization: Bearer olea_YOUR_KEY" \ "https://api.oleamarkets.com/v1/regional?country=ES®ion=jaen&grade=evoo"
data: { "window_days": 30, "count": N, "observations": [...] } where each
observation carries date, source, quality_grade,
country, region, market, price_eur_kg and
volume_tons. metric: price.observations.regional.
GET/v1/spread — Spread between gradespaid
Spread between two quality grades: absolute (a - b) and % vs b.
Each leg uses the latest index value when an index covers the (grade, country) pair
(basis: "index"), otherwise the plain mean of publishable observations from
the last 30 days (basis: "observations"). metric: price.spread.
Parameters
| Param | Required | Description |
|---|---|---|
a | yes | First grade (minuend). |
b | yes | Second grade (base of the % spread). |
country | no | ISO2, default ES. |
Example request
curl -H "Authorization: Bearer olea_YOUR_KEY" \ "https://api.oleamarkets.com/v1/spread?a=evoo&b=lampante&country=ES"
Example response (data)
{
"country": "ES",
"a": { "grade": "evoo", "basis": "index", "index": "OLEA-EVOO-ES", "date": "2026-07-14", "value_eur_kg": 4.512 },
"b": { "grade": "lampante", "basis": "index", "index": "OLEA-LAMP-ES", "date": "2026-07-14", "value_eur_kg": 3.401 },
"spread_abs_eur_kg": 1.111,
"spread_pct": 32.67
}
GET/v1/stocks — Market stockspaid
Official stock data in tons, ordered by month descending. unit: tons, metric: market.stocks.
Parameters
| Param | Description |
|---|---|
country | ISO2 filter, optional. |
Example request
curl -H "Authorization: Bearer olea_YOUR_KEY" "https://api.oleamarkets.com/v1/stocks?country=ES"
data.rows[]: country, campaign, month,
stock_tons, outflow_tons, production_tons, source.
GET/v1/sources — Data sources
Sources with tier (official, semi_official, cooperative,
press) and freshness: timestamp of the last successful raw fetch and date of the
last observation. metric: meta.sources, unit: none.
Example request
curl -H "Authorization: Bearer olea_YOUR_KEY" https://api.oleamarkets.com/v1/sources
Errors & codes
Errors use the same envelope with success: false and an error object:
Example error response
{
"success": false,
"data": null,
"unit": null,
"metric": null,
"reliability": null,
"error": {
"code": "payment_required",
"message": "This endpoint requires a paid plan (starter, pro or enterprise). See https://oleamarkets.com/pricing to upgrade.",
"docs_url": "https://oleamarkets.com/docs"
},
"meta": { "request_id": "3f7f0f1e-8f0a-4a52-9f9b-1c2d3e4f5a6b", "credits_used": 0 }
}
Error codes
| Code | HTTP | When |
|---|---|---|
unauthenticated | 401 | Missing or invalid API key. |
payment_required | 403 | The key's plan does not include this endpoint. |
not_found | 404 | No data matches the request. |
validation_error | 422 | Invalid parameters. |
quota_exceeded | 429 | Monthly quota exhausted (capped at 100 calls during an active trial). |
rate_limited | 429 | Per-minute rate limit hit. |
Rate limits & plans
Billed monthly or annually (annual = 2 months free) via Stripe — in EUR inside Europe and USD elsewhere, with the same numerals in both currencies. Prices below are per month; the annual plan is ten times the monthly price. Every plan includes all markets and daily index updates. Sign up at oleamarkets.com/pricing.
| Plan | Price / month | Monthly quota | Rate limit | Widget views | History depth | Support |
|---|---|---|---|---|---|---|
| Starter | $99.99 / €99.99 | 10,000 calls | 60 req/min | 1,000/day | 1 year back from today | Email support |
| Pro | $199.99 / €199.99 | 50,000 calls | 120 req/min | 10,000/day | Full history | Priority support |
|
Business
API plan code: enterprise
|
$499.99 / €499.99 | 250,000 calls | 240 req/min | 100,000/day | Full history | Specialized support |
| Enterprise | From $10,000 / €10,000 per year | Custom | Custom | Custom | Full history | Dedicated support & SLA |
Enterprise is custom — contact us: custom rate limits and quotas, redistribution licence, dedicated support & SLA and onboarding, from $10,000 / €10,000 per year. Write to [email protected].
429 quota_exceeded with a trial-specific message. Once the trial
converts, the full plan quota applies.
Paid endpoints (historical, regional, spread,
stocks) return 403 payment_required on keys without a paid plan.
Exhausting the monthly quota returns 429 quota_exceeded; exceeding the
per-minute rate limit returns 429 rate_limited.
MCP server
AI agents can talk to the API natively over the Model Context Protocol:
POST https://api.oleamarkets.com/mcp (JSON-RPC 2.0, MCP protocol revision
2025-03-26). Point any MCP-capable client (Claude, IDE agents, etc.) at that
endpoint as a remote HTTP server.
Tools
| Tool | Arguments | Auth |
|---|---|---|
get_olive_oil_price | index (optional) | none |
get_price_history | index, from, to | paid key via Authorization: Bearer |
compare_grades | a, b, country | none |
get_market_stocks | country (optional) | none |
get_sources_status | — | none |
Example request
curl -X POST https://api.oleamarkets.com/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_olive_oil_price","arguments":{"index":"OLEA-EVOO-ES"}}}'
OpenAPI spec
The full machine-readable OpenAPI 3.1 description of every endpoint, schema and error lives
at https://api.oleamarkets.com/openapi.json —
generate clients, import it into Postman or feed it to your agent. A condensed plain-text
summary for LLMs is at https://api.oleamarkets.com/llms.txt.